#include<stdio.h>

//数组名 是数组的首地址
//函数名 是函数的首地址

//typedef  为变量类型改名
//unsigned int --> u32

typedef unsigned int u32;
// u32 num = 42;  等价于 unsigned int num = 42;

//宏替换
//unsigned int --> my_u32
#define my_u32 unsigned int

/*
两者的区别
#define 需要改的变量名 写前面
typedef 需要在后面加 ';'
*/

// 加
int add(int val1, int val2)
{
    return val1 + val2;
}

// 减
int subtract(int val1, int val2)
{
    return val1 - val2;
}

// 乘
int multiply(int val1, int val2)
{
    return val1 * val2;
}

// 除
int divide(int val1, int val2)
{
    return val1 / val2;
}

/*
定义了一个函数指针类型，名为 count_func
typedef：用于为现有类型创建别名。

int (*count_func)(int, int)：

int 是函数的返回值类型

(*count_func) 表示这是一个指针类型，指针名为 count_func

(int, int) 是函数的参数列表，表示该函数接受两个 int 参数

因此，count_func 是一个类型别名，它可以指向任何符合 int func(int, int) 签名的函数
*/
typedef int (*count_func)(int ,int);
// count_func  my_func_ptr;    等价于
//     int     (*my_func_ptr)(int, int);

int main(int argc, char const *argv[])
{
    //初始化 回调函数数组
    //声明了一个长度为4的数组 func，每个元素都是 count_func 类型的函数指针
    count_func func[4];
    
    //回调函数数组 填写函数
    func[0] = add;
    func[1] = subtract;
    func[2] = multiply;
    func[3] = divide;

    int val_1=0;
    int val_2=0;
    char ch;

    printf("请输入你的算式");
    scanf("%d %c %d",&val_1,&ch,&val_2);

    switch (ch)
    {
        case '+':
        printf("%d + %d = %d\n", val_1, val_2, func[0](val_1, val_2));
        break;

    case '-':
        printf("%d - %d = %d\n", val_1, val_2, func[1](val_1, val_2));
        break;

    case '*':
        printf("%d * %d = %d\n", val_1, val_2, func[2](val_1, val_2));
        break;

    case '/':
        printf("%d / %d = %d\n", val_1, val_2, func[3](val_1, val_2));
        break;

    default:
        break;
    }
    return 0;
}
